/* eslint-disable no-undef */
const getCookie = function (key) {
    return decodeURIComponent(
        document.cookie.replace(
            new RegExp('(?:(?:^|.*;)\\s*' + encodeURIComponent(key).replace(/[-.+*]/g, '\\$&') + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1')
    ) || ''
}
/**
 * 鉴于微信下 安卓 和 IOS 表现有区别，签名时逻辑如下处理：
 1. 安卓下获取签名的URL：
 location.href.split('#')[0]
 2. IOS下获取签名的URL：
 在 index.html 入口处，加入如下脚本，将第一次进入网页的url存下来:
 localStorage.setItem('location.href', location.href)
 签名时获取即可，localStorage.getItem('location.href').split('#')[0]
 注意：如果过程中使用了如下代码： window.history.pushState('', document.title, location.href.split('?')[0])，微信开发者工具中，ios将签名失败
 */
let scriptPromise = null
let wxInitialComplete = false
function loadPromise() {
    if (scriptPromise) {
        return scriptPromise
    }
    scriptPromise = new Promise((resolve) => {
        let el = document.createElement('script')
        el.src = 'https://oss.petslib.cn/prod/static/cdns/weixin/jweixin-1.6.0.js'
        el.onload = resolve
        let s = document.getElementsByTagName('script')[0]
        s.parentNode.insertBefore(el, s)
    })
    return scriptPromise
}

function getMetaInfo(metaName) {
    const metas = document.getElementsByTagName('meta')
    for (let i = 0; i < metas.length; i++) {
        if (metas[i].getAttribute('name') === metaName) {
            return metas[i].getAttribute('content')
        }
    }
    return ''
}

export function getShareUrl() {
    const search = new URLSearchParams(location.search)
    let url = location.href.split('?')[0]
    if (search) {
        // 删除不要的参数
        search.delete('code')
        const r = search.toString()
        if (r) url += '?' + r
    }
    return url
}

// https://developers.weixin.qq.com/community/develop/doc/000286cc17433072a93d7a8ba51000
// 这是正常的，微信在上次开放全域名后改的。目前还可以从公众号菜单进入分享、访问网页后添加到收藏，从我的收藏进入分享正常。其他入口应该分享都是链接了。
export async function wxShareCard() {
    const imgUrl = 'https://oss.petslib.cn/prod/static/h5/imgs/share-logo.png'
    wx.updateAppMessageShareData({
        title: document.title, // 分享标题
        desc: getMetaInfo('keywords'), // 分享描述
        link: getShareUrl(), // 分享链接，该链接域名或路径必须与当前页面对应的公众号 JS 安全域名一致
        imgUrl,// 分享图标
        success: function () {
            console.log('updateAppMessageShareData 分享配置成功')
        }
    })
    wx.updateTimelineShareData({
        title: document.title, // 分享标题
        link: getShareUrl(), // 分享链接，该链接域名或路径必须与当前页面对应的公众号 JS 安全域名一致
        imgUrl,// 分享图标
        success: function () {
            console.log('updateTimelineShareData 分享配置成功')
        }
    })
}

export async function initWxConfig() {
    if (wxInitialComplete) {
        return Promise.resolve()
    }
    if (!/MicroMessenger/i.test(navigator.userAgent)) {
        return
    }
    return new Promise((resolve, reject) => {
        loadPromise().then(async () => {
            // console.log('wx', wx)
            let wxSignUrl = location.href.split('#')[0]
            if (/iPhone|iPad|iPod/i.test(navigator.userAgent)) {
                wxSignUrl = localStorage.getItem('location.href').split('#')[0]
            }
            // console.log('wxSignUrl', wxSignUrl)
            const token = getCookie('token')
            const { data } = await fetch(`${globalEnv.VITE_API}/auth/get-js-config`, {
                method: 'POST',
                credentials: 'include',
                headers: token ? { Authorization: 'Bearer ' + token } : {},
                body: JSON.stringify({
                    url: wxSignUrl
                })
            }).then(res => res.json())
            const {
                timestamp,
                nonceStr,
                signature,
                appId,
            } = data
            wx.config({
                debug: false,
                appId,
                timestamp, // 必填，生成签名的时间戳
                nonceStr, // 必填，生成签名的随机串
                signature,// 必填，签名
                jsApiList: [
                    'chooseWXPay',
                    'updateAppMessageShareData',
                    'updateTimelineShareData',
                ]
            })
            wx.ready(function (res) {
                console.log('wx.success', res)
                wxInitialComplete = true
                wxShareCard()
                resolve()
            })
            wx.error(function (res) {
                console.log('wx.error', res)
                reject(res)
            })
        })
    })
}

export default function setupWeixin(app) {
    app.config.globalProperties.globalInitWxConfig = initWxConfig
}